package com.yunchao.library.socket.model.control


import com.yunchao.library.socket.extensions.toReadOnlyBuffer
import com.yunchao.library.socket.utils.ValidationUtils

data class ConfirmRequest(
    val id: UInt,
    val fragment: UInt,
    val completeFlags: CompleteFlags
) {
    init {
        ValidationUtils.validateIdHighBit(id)
    }

    companion object {
        fun fromByteArray(bytes: ByteArray): ConfirmRequest {
            val buffer = bytes.toReadOnlyBuffer()
            return ConfirmRequest(
                id = buffer.int.toUInt(),
                fragment = buffer.int.toUInt(),
                completeFlags = parseCompleteFlags(buffer.short.toUShort())
            )
        }

        // 解析complete字段的各个标志位
        fun parseCompleteFlags(complete: UShort): CompleteFlags {
            return CompleteFlags(
                requestDelete = complete and 0x8000u != 0u.toUShort(),  // 第16位(1<<15)  表示要求删除已经存储的控制数据以及可能存在的、与该控制数据对应的提交数据。
                validationFailed = complete and 0x0002u != 0u.toUShort(), // 第2位(1<<1) 表示执行前或提交后数据验证失败。
                rejected = complete and 0x0001u != 0u.toUShort()         // 第1位(1<<0)  表示提交的控制数据未被通讯组件接受。用户应该在解决问题后再次提交
            )
        }

    }




    // Complete字段的标志位解析结果
    data class CompleteFlags(
        val requestDelete: Boolean,    // 是否要求删除数据
        val validationFailed: Boolean, // 数据验证是否失败
        val rejected: Boolean          // 是否被组件拒绝
    )
}